//package com.example.kiratest.EasyExcel.Handler;
//
//import com.alibaba.excel.EasyExcel;
//import com.alibaba.excel.ExcelWriter;
//import com.alibaba.excel.write.metadata.WriteSheet;
//import com.example.kiratest.EasyExcel.Mapper.ExcelMapper;
//import com.example.kiratest.EasyExcel.pojo.Excel;
//import com.example.kiratest.EasyExcel.pojo.ExcelImportExportEnum;
//import com.github.pagehelper.PageHelper;
//import jakarta.annotation.Resource;
//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
//import org.springframework.stereotype.Component;
//
//import java.util.ArrayList;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.CountDownLatch;
//
//@Component
//public class EnterprisePilotExcelExportHandler implements ExcelExportHandler<Excel> {
//
//    @Resource
//    private ExcelMapper excelMapper;
//
//    @Resource
//    Map<String, ThreadPoolTaskExecutor> ThreadPoolMap;
//
//
//    @Override
//    public ExcelImportExportEnum getEnum() {
//        return ExcelImportExportEnum.PILOT_ENTERPRISE;
//    }
//
//
//    //每批10w，一个线程处理30w，每个sheet页写入最多是10w    记住,我们Sheet页的写入是严格控制一个线程一次写入是10w条数据
//    //逻辑：我们多线程+深分页优化速率，通过严格控制每个线程写入的sheet页来验证保证java程序不会出现OOM问题
//    @Override
//    public List<Excel> getData(String searchCondition) throws InterruptedException {
//
//        ThreadPoolTaskExecutor easyExcelThreadPool = ThreadPoolMap.get("EasyExcelThreadPool");//拿到线程池
//
//        List<Excel> dataList = new ArrayList();
//        int pageSize = 100000;//10w为一批
//        Integer total = excelMapper.countTotal();//统计数据总数
//
//        //batchSize>=3,用一个线程,6就是2个线程,9就是3个线程
//        int batchSize = (int) Math.ceil((double) total / pageSize);//一共要执行的批次
//
//        int everythreadSize = batchSize / 3;//一共开三个线程,每个线程应该负责多少批次
//
//
//        CountDownLatch countDownLatch;
//
//        //初始化CountDownLatch()
//        if (batchSize > 3 && batchSize < 6) {
//            countDownLatch = new CountDownLatch(2);
//        } else if (batchSize > 6) {
//            countDownLatch = new CountDownLatch(3);
//        } else {
//            countDownLatch = new CountDownLatch(1);
//        }
//
//        //开始EasyExcel写入
//        String filePath = "C:\\Users\\ziJian.zheng\\IdeaProjects\\Kira-Test\\src\\main\\resources\\templates\\test.xlsx";
//        //用来写入的ExcelWriter
//        ExcelWriter writer = EasyExcel.write(filePath).build();
//
//
//        //主线程执行
//        try {
//            int first = 0;//作为sheet页标识,也就是批次标识
//            Integer lastId = null;
//            //多Sheet写入
//            for (int i = 0; i < everythreadSize; i++) {
//                WriteSheet sheet = EasyExcel.writerSheet("批次" + first++).build();
//                if (i == 0) {//也就是我们的第一次写入
//                    PageHelper.startPage(pageSize, 0);//第一次普通的分页查询,后面要知道id，使用书签法来优化深度分页问题
//                    List<Excel> excels = excelMapper.selectAllOrderById();
//
//                    if (excels.size() > batchSize)
//                        lastId = excels.get(batchSize - 1).getId();
//
//                    writer.write(excels, sheet);
//                } else { //我们的书签法优化
//                    List<Excel> excels = excelMapper.deepPaginationSelect(lastId, batchSize);
//                    writer.write(excels, sheet);
//                }
//            }
//        } finally {
//            countDownLatch.countDown();
//        }
//
//
//        //开启异步线程
//        if (batchSize > 3 && batchSize < 6) {
//            easyExcelThreadPool.execute(() -> {
//                try {
//                    int first = everythreadSize + 1;//作为sheet页标识,也就是批次标识
//                    Integer lastId = null;
//                    //多Sheet写入
//                    for (int i = 0; i < everythreadSize; i++) {
//                        WriteSheet sheet = EasyExcel.writerSheet("批次" + first++).build();
//                        if (i == 0) {//也就是我们的第一次写入
//                            PageHelper.startPage(pageSize, 0);//第一次普通的分页查询,后面要知道id，使用书签法来优化深度分页问题
//                            List<Excel> excels = excelMapper.selectAllOrderById();
//
//                            if (excels.size() > batchSize)
//                                lastId = excels.get(batchSize - 1).getId();
//
//                            writer.write(excels, sheet);
//                        } else { //我们的书签法优化
//                            List<Excel> excels = excelMapper.deepPaginationSelect(lastId, batchSize);
//                            writer.write(excels, sheet);
//                        }
//                    }
//                } finally {
//                    countDownLatch.countDown();
//                }
//            });
//        }
//        if (batchSize > 6) {
//            easyExcelThreadPool.execute(() -> {
//                try {
//                    int first = 2*everythreadSize + 1;//作为sheet页标识,也就是批次标识
//                    Integer lastId = null;
//                    //多Sheet写入
//                    for (int i = 0; i < everythreadSize; i++) {
//                        WriteSheet sheet = EasyExcel.writerSheet("批次" + first++).build();
//                        if (i == 0) {//也就是我们的第一次写入
//                            PageHelper.startPage(pageSize, 0);//第一次普通的分页查询,后面要知道id，使用书签法来优化深度分页问题
//                            List<Excel> excels = excelMapper.selectAllOrderById();
//
//                            if (excels.size() > batchSize)
//                                lastId = excels.get(batchSize - 1).getId();
//
//                            writer.write(excels, sheet);
//                        } else { //我们的书签法优化
//                            List<Excel> excels = excelMapper.deepPaginationSelect(lastId, batchSize);
//                            writer.write(excels, sheet);
//                        }
//                    }
//                } finally {
//                    countDownLatch.countDown();
//                }
//
//
//            });
//        }
//
//
//
//        countDownLatch.await();
//
//
//        return dataList;
//    }
//
//    @Override
//    public Class<Excel> getExportType() {
//        return Excel.class;
//    }
//}
